package com.ljy.my_study.leetcode.medium.从中序与后序遍历序列构造二叉树;

import com.ljy.my_study.util.TreeNodeUtil;
import com.ljy.my_study.util.TreeNodeUtil.*;

import java.util.HashMap;
import java.util.Map;

public class TestMain {

//    给定两个整数数组 inorder 和 postorder ，其中 inorder 是二叉树的中序遍历， postorder 是同一棵树的后序遍历，请你构造并返回这颗 二叉树 。
//
//             
//
//    示例 1:
//
//
//    输入：inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
//    输出：[3,9,20,null,null,15,7]
//    示例 2:
//
//    输入：inorder = [-1], postorder = [-1]
//    输出：[-1]
//             
//
//    提示:
//
//            1 <= inorder.length <= 3000
//    postorder.length == inorder.length
//-3000 <= inorder[i], postorder[i] <= 3000
//    inorder 和 postorder 都由 不同 的值组成
//    postorder 中每一个值都在 inorder 中
//    inorder 保证是树的中序遍历
//    postorder 保证是树的后序遍历
//
//    来源：力扣（LeetCode）
//    链接：https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal
//    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

    public static void main(String[] args) {

    }

    Map<Integer,Integer> indexMap=new HashMap<>();
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if(inorder.length==0){
            return null;
        }
        int len=inorder.length;
        for(int i=0;i<len;i++){
            indexMap.put(inorder[i],i);
        }
        return doBuildTree(inorder,postorder,0,len-1,0,len-1);
    }

    private TreeNode doBuildTree(int[] inorder, int[] postorder,int inLeft,int inRight,int postLeft,int postRight){
        if(inLeft>inRight||postLeft>postRight){
            return null;
        }
        int len=inorder.length;
        int postRootIndex=postRight;
        TreeNode node=new TreeNode();
        node.val=postorder[postRootIndex];
        int rootValue=node.val;
        int postRightIndex=postRight-1;

        int inRootIndex=indexMap.get(rootValue);

        node.left=doBuildTree(inorder,postorder,inLeft,inRootIndex-1,postLeft,postLeft+inRootIndex-inLeft-1);
        node.right=doBuildTree(inorder,postorder,inRootIndex+1,inRight,postLeft+inRootIndex-inLeft,postRightIndex);
        return node;
    }
}
